\chapter{网络层}

\section{网络层}

\subsection{数据平面与控制平面}

在网络中，每一台主机和路由器都有网络层。网络层提供了在发送主机与接收主机之间传送段的服务，在发送端将段封装到数据报中，在接收端将段上交给传输层实体。\\

网络层可以分解为数据平面（data plane）和控制平面（control plane）这两个互相作用的部分。数据平面指每台路由器的功能，决定从路由器的输入端口如何转发（forwarding）到输出端口。控制平面指的是数据包如何在路由器之间路由（routing），决定了数据报从源到目标主机之间的端到端路径。\\

每台路由器都有一个转发表（forwarding table），路由器使用分组首部的字段值在转发表中索引，指出该分组将被转发的输出端口。\\

配置路由器转发表的传统方法是，根据路由器中的路由选择算法与其它路由器中的路由选择算法通信，从而计算出它的转发表的值，这种通信根据路由选择协议交换包含路由选择信息的路由选择报文。\\

另一种方法称为软件定义网络SDN（Software-Defined Networking），通过由ISP或第三方管理的远程控制器计算并分发转发表以供每台路由器使用。路由器只执行转发，没有选择功能。因为计算转发表并与路由器交互的控制器是用软件实现的，故得其名。

\newpage

\section{IP协议}

\subsection{IPv4}

IPv4地址长度为32位（4字节），通常以点分十进制记法（dotted-decial notation）表示。例如11000001 00100000 11011000 00001001的点分十进制表示为192.32.216.9。\\

IP地址由网络号（subnet part）和主机号（host part）构成，网络号相同的IP地址属于同一网段。\\

国际标准组织ISO将IP地址分为5大类。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,8) node[left, yshift=0.5cm]{A类} rectangle (10,9);
        \draw (0,6) node[left, yshift=0.5cm]{B类} rectangle (10,7);
        \draw (0,4) node[left, yshift=0.5cm]{C类} rectangle (10,5);
        \draw (0,2) node[left, yshift=0.5cm]{D类} rectangle (10,3);
        \draw (0,0) node[left, yshift=0.5cm]{E类} rectangle (10,1);

        \draw (0.5,8) -- (0.5,9);
        \draw (3,8) -- (3,9);
        \draw (0.25,8.5) node{1};
        \draw (1.75,8.5) node{网络号7位};
        \draw (6.5,8.5) node{主机号24位};

        \draw (1,6) -- (1,7);
        \draw (5,6) -- (5,7);
        \draw (0.5,6.5) node{10};
        \draw (3,6.5) node{网络号14位};
        \draw (7.5,6.5) node{主机号16位};

        \draw (1.5,4) -- (1.5,5);
        \draw (7.5,4) -- (7.5,5);
        \draw (0.75,4.5) node{110};
        \draw (4.5,4.5) node{网络号21位};
        \draw (8.75,4.5) node{主机号8位};

        \draw (2,2) -- (2,3);
        \draw (1,2.5) node{1110};

        \draw (2.5,0) -- (2.5,1);
        \draw (1.25,0.5) node{1110};
    \end{tikzpicture}
    \caption{IP地址分类}
\end{figure}

\vspace{0.5cm}

A类地址的网络有$ 2^7 - 2 = 126 $（全为0和1的地址保留），每个网络能容纳$ 2^{24} - 2 = 1677214 $个主机。\\

B类地址的网络有$ 2^{14} - 2 = 16384 $，每个网络能容纳$ 2^{16} - 2 = 65534 $个主机。\\

C类地址的网络有$ 2^{21} - 2 = 2097152 $，每个网络能容纳$ 2^8 - 2 = 254 $个主机。\\

D类地址被用于多点广播（multicast），多点广播地址用来一次寻址一组计算机。\\

E类地址为将来使用保留，仅作实验和开发用。\\

国际规定有一部分IP地址用于局域网，不在公网中使用。它们的范围是：

\begin{itemize}
    \item 10.0.0.0 $ \sim $ 10.255.255.255
    \item 172.16.0.0 $ \sim $ 172.31.255.255
    \item 192.168.0.0 $ \sim $ 192.168.255.255
\end{itemize}

\vspace{0.5cm}

\subsection{子网掩码（subnet mask）}

目前因特网的地址分配策略采用的是无类别域间路由选择CIDR（Classless InterDomain Routing），IP地址的形式为a.b.c.d/x，其中最高x位构成了IP地址的网络部分。\\

这样就能够把每类IP地址进一步分成更小的网络，从而显著提高了IP地址的分配效率，有效解决了IP地址资源紧张的局面。例如200.23.16.0/23表示IPv4地址的前23位为网络部分。

\newpage

\section{路由选择算法}

\subsection{路由选择算法（Routing Algorithm）}

路由器转发分组是通过路由表转发的，而路由表是通过各种算法得到的。路由选择算法分为静态路由算法和动态路由算法。\\

静态路由算法（非自适应路由算法）由网络管理员手工配置路由信息。当网络的拓扑结构或链路的状态发生变化时，需手工修改路由表中的静态路由信息。它不能及时适应网络状态的变化，因此仅用于简单的小型网络。\\

动态路由算法（自适应路由算法）是一种自动化的路由算法，它能根据网络的状态及路由表的变化自动适应网络状态的变化。这些路由信息会在一定时间间隙里不断更新，以随时获得最优的寻路效果。\\

\subsection{链路状态算法（Link-State Routing Protocol）}

链路状态算法属于全局式路由选择算法，所有网络拓扑信息都是已知的，通过使用Dijkstra算法得到源点到各个结点的最短路径。\\

当算法终止时，每个结点都能得到从源结点沿着它的最低开销路径的前一结点。对于每个前一结点，又有它的前一结点，以此方式可以构建从源结点到所有目的结点的完整路径。\\

\subsection{距离向量算法（Distance-Vector Routing Protocol）}

距离向量算法是分布式的，因为每个结点都要从一个或多个直连邻居接收信息，执行计算，然后将结果分发给邻居。\\

距离向量算法根据Bellman-Ford方程$ d_x(y) = min\{c(x, y) + d_v(y)\} $得来，其中$ d_x(y) $表示从x到y的最小开销，$ c(x, v) $表示x到邻居v的开销，$ d_v(y) $表示从邻居v到终点y的开销。\\

该算法的结点具有的唯一信息是它到直接邻居的链路开销和它从这些邻居接收到的信息，每个结点等待来自任何邻居的更新。

\newpage